package dao;

import hbt.HibernateUtil;



import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Dominio.ItemOrdenDePedido;
import Dominio.OrdenDePedido;


public class OrdenPedidoDAO {

	private static OrdenPedidoDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;
	
	public static OrdenPedidoDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new OrdenPedidoDAO();
		} 
		return instancia;
	}
	
	private Session getSession(){
		if(session == null || !session.isOpen())
			session = sf.openSession();
		return session;
	}
	
	public void closeSession(){
		if (session.isOpen()) session.close();
	}
	
	public OrdenDePedido persistOrdenPedido(OrdenDePedido ordenPedido){
		Session s=getSession();
		s.beginTransaction();
		s.persist(ordenPedido);
		//s.saveOrUpdate(ordenPedido);
		s.flush();
		s.getTransaction().commit();
		return ordenPedido;
	}
	
	public ItemOrdenDePedido persistItemPedido(ItemOrdenDePedido item){
		Session s=getSession();
		s.beginTransaction();
		s.persist(item);
		s.flush();
		s.getTransaction().commit();
		return item;
	}
	
	public OrdenDePedido getOrdenPedido(int numeroOrdenPedido)
	{
		Session s=getSession();
		s.beginTransaction();
		OrdenDePedido ordenPedido = (OrdenDePedido)s.createQuery("select op from OrdenDePedido op where op.numeroOrdenPedido = :nro" ).setParameter("nro", numeroOrdenPedido).uniqueResult();
		s.getTransaction().commit();
		return ordenPedido;
	}
	
	public ItemOrdenDePedido getItemPedido(int idItemPedido){
		Session s=getSession();
		s.beginTransaction();
		ItemOrdenDePedido item = (ItemOrdenDePedido)s.load(ItemOrdenDePedido.class, new Integer(idItemPedido));
		s.getTransaction().commit();
		return item;
	}
	
	@SuppressWarnings("unchecked")
	public List<OrdenDePedido> listarOrdenesDePedido(){
	
	Session s = this.getSession();
	List<OrdenDePedido> lista= s.createQuery("from ordenDePedido").list();
	return lista;
	}

	@SuppressWarnings("unchecked")
	public List<ItemOrdenDePedido> listarItemsOrdenDePedido(int nroOrdenDePedido)
	{
		try
		{
			Session s = this.getSession();
			s.beginTransaction();
			List<ItemOrdenDePedido> lista= (List<ItemOrdenDePedido>)s.createQuery("select items from OrdenDePedido OP inner join OP.itemsDePedido items where OP.numeroOrdenPedido = :nroOrdenDePedido").setParameter("nroOrdenDePedido", nroOrdenDePedido).list();
			s.getTransaction().commit();
			return lista;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}

	public OrdenDePedido getOrdenPedidoPorNum(String numOP) {
		try
		{
			Session s = getSession();
			String query = "select op from OrdenDePedido op where op.numeroOrdenPedido  = '"+numOP+"'";
			OrdenDePedido op = (OrdenDePedido) s.createQuery(query).uniqueResult();
			s.clear();
			return op;
		}
		catch(Exception e)
		{
			return null;
		}
	}

	public void actualizarOrden(OrdenDePedido actualizada) 
	{
		try
		{
			Session s = getSession();
			s.beginTransaction();			
			s.saveOrUpdate(actualizada);
			//sc.setId(sc.getId());
			//s.persist(sc);
			s.flush();
			s.getTransaction().commit();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
	}

	
}
